Skip to content

chore(release): human-readable release notes (github-native changelog)#57

Merged
skipi merged 3 commits into
mainfrom
mk/sem-ai/changelog-notes
Jun 17, 2026
Merged

chore(release): human-readable release notes (github-native changelog)#57
skipi merged 3 commits into
mainfrom
mk/sem-ai/changelog-notes

Conversation

@skipi

@skipi skipi commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator

What

Release notes were a raw SHA dump (<full-sha> <subject>), and the ^chore:-style GoReleaser filters missed scoped conventional commits — so the chore(release): bump PR leaked into the v0.1.23 notes.

This makes release notes human-readable and keeps them that way with zero per-PR effort.

.goreleaser.yaml — github-native notes

changelog.use: github-native. Notes become the familiar "What's Changed" list of PR titles + author handles + a Full Changelog compare link, generated by GitHub.

.github/release.yml — grouping & exclusion

Drives the notes (used both by GoReleaser and the generate-notes API). Groups by PR label:

  • enhancement → 🚀 Features
  • bug → 🐛 Bug Fixes
  • documentation → 📚 Documentation
  • * → Other Changes
  • excludes skip-changelog + bot authors (release-bump PRs vanish).

.github/workflows/pr-autolabel.yml — keep it zero-touch

Tiny GitHub Action that labels each PR from its conventional-commit title (featenhancement, fixbug, docsdocumentation, chore(release)skip-changelog). Labels only — no CI, doesn't touch Semaphore. The title is read via the github-script context object (runtime value, not ${{ }}-interpolated into a shell) and the label comes from a fixed map, so the untrusted title is never executed.

Follow-up (after merge, no code)

Backfill the notes for the last 3 releases (v0.1.21–v0.1.23) via the generate-notes API — it reads .github/release.yml from the default branch, which is why this PR lands first. Historical PRs in that range get labelled per the same mapping so the backfilled notes group correctly.

🤖 Generated with Claude Code

Also (rode along — was blocking this PR's own CI)

Two pre-existing CI flakes surfaced while getting this PR green, fixed in the last commit:

  • Lint: golangci-lint install hit GitHub's latest-release API and 504'd → pinned v2.12.2 to skip that lookup.
  • Coverage: artifact push ... coverage.out lacked --force, so any workflow rerun failed (artifact already exists) → added --force.

These block reruns/releases generally, not just this PR.

GoReleaser's default changelog dumped raw `<full-sha> <subject>` lines and
its `^chore:`-style filters missed scoped conventional commits (so the
`chore(release):` bump leaked into the notes). Switch to GitHub's native
release-note generator:

- .goreleaser.yaml: changelog.use github-native — notes become the familiar
  "What's Changed" list of PR titles + authors + a Full Changelog compare link.
- .github/release.yml: drives grouping/exclusion for both GoReleaser and the
  releases/generate-notes API. Groups by PR label (enhancement→Features,
  bug→Bug Fixes, documentation→Docs, * → Other), excludes skip-changelog +
  bot authors so release-bump PRs no longer show up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keeps github-native release notes grouping with zero per-PR effort: labels
each PR from its title prefix (feat→enhancement, fix→bug, docs→documentation,
chore(release)→skip-changelog). Other prefixes stay unlabelled → "Other
Changes". GitHub-side only (labels, no CI) — does not touch Semaphore.

Title is read via the github-script `context` object (runtime JS value, not
`${{ }}`-interpolated into a shell) and the label is chosen from a fixed map,
so the untrusted title is never executed or reflected into the label.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the skip-changelog Exclude this PR from release notes label Jun 17, 2026
Two pre-existing CI flakes that block reruns/releases:

- Lint installs golangci-lint via `install.sh` with no version, so every run
  calls the GitHub "latest release" API — which intermittently 504s and fails
  the job. Pin v2.12.2 (the version it was resolving to) to skip that lookup.
- Coverage does `artifact push workflow coverage.out` without --force, so any
  rebuild of the workflow fails: the artifact already exists. Add --force to
  make reruns idempotent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@skipi skipi merged commit e020d8b into main Jun 17, 2026
2 checks passed
@skipi skipi deleted the mk/sem-ai/changelog-notes branch June 17, 2026 09:16
@skipi skipi mentioned this pull request Jun 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changelog Exclude this PR from release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants